library(dplyr)
package 㤼㸱dplyr㤼㸲 was built under R version 4.0.5
Attaching package: 㤼㸱dplyr㤼㸲

The following objects are masked from 㤼㸱package:stats㤼㸲:

    filter, lag

The following objects are masked from 㤼㸱package:base㤼㸲:

    intersect, setdiff, setequal, union
library(tidyverse)
package 㤼㸱tidyverse㤼㸲 was built under R version 4.0.5Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages -------------------------------------------------------- tidyverse 1.3.1 --
v ggplot2 3.3.5     v purrr   0.3.4
v tibble  3.1.5     v stringr 1.4.0
v tidyr   1.1.4     v forcats 0.5.1
v readr   2.0.2     
package 㤼㸱ggplot2㤼㸲 was built under R version 4.0.5package 㤼㸱tibble㤼㸲 was built under R version 4.0.5package 㤼㸱tidyr㤼㸲 was built under R version 4.0.5package 㤼㸱readr㤼㸲 was built under R version 4.0.5package 㤼㸱forcats㤼㸲 was built under R version 4.0.5-- Conflicts ----------------------------------------------------------- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
library(tidyr)
library(ggplot2)
library(scales)

Attaching package: 㤼㸱scales㤼㸲

The following object is masked from 㤼㸱package:purrr㤼㸲:

    discard

The following object is masked from 㤼㸱package:readr㤼㸲:

    col_factor
library(RColorBrewer)
library(plotly)
package 㤼㸱plotly㤼㸲 was built under R version 4.0.5Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attaching package: 㤼㸱plotly㤼㸲

The following object is masked from 㤼㸱package:ggplot2㤼㸲:

    last_plot

The following object is masked from 㤼㸱package:stats㤼㸲:

    filter

The following object is masked from 㤼㸱package:graphics㤼㸲:

    layout




1 Introduction

Aviation saftey is a topic that hits close to home, as I recently lost a co-worker in an airplane crash. For this project, my goal is to explore airplane crashes worldwide to find out how often they are occurring, what manufacturer has the most, and how many fatalities are there as a result. For my project, I am using the Airplane Crash Data Since 1908 dataset, which is a collection of the number of crashes from 1908 till 2019.

1.1 The Dataset

#My data 
crashes <- read.csv("../data/airplanedata.csv")
head(crashes)




2 Data Wrangling and Exploration

#Separating the Date column into 3 different ones to perform a better analysis
df <- separate(data = crashes,col = Date, into = c("Month", "Day", "Year"), sep = "\\/")
#Selecting the columns that I need to perform my analysis
date_df <- select(df, c(Month, Year, Fatalities, Aboard, AC.Type))
#Changing the data type of fatalities to a numeric
date_df$Fatalities <- as.numeric(date_df$Fatalities)
NAs introduced by coercion
#Changing all the NAs to 0s
date_df[is.na(date_df)] <- 0
#Changing the data type of year to a numeric
date_df$Year <- as.numeric(date_df$Year)
#Creating a new column in our dataset called decade
date_df <- date_df %>% 
  mutate(Decade = floor(Year/10) * 10)
#Summing all the fatalities per Year
year_df <- date_df %>% 
  group_by(Year) %>% 
  summarise(Fatalities = sum(Fatalities))
#Summing all the fatalities per Decade
decade_df <- date_df %>% 
  group_by(Decade) %>% 
  summarise(Fatalities = sum(Fatalities))
#Creating a new dataset, that has no NAs
df_country <- crashes
df_country[is.na(df_country)] <- ""

#grouping them by Location, and tallying them up, and selecting the locations that had more than 10 crashes
df_country1 <- df_country %>% 
  group_by(Location) %>% 
  tally() %>% 
  filter(n >= 10)

#splitting the location couling into city, region, and country
df_country1$Loc <- df_country1$Location
df_country1 <- separate(data = df_country1, col = Location, into = c("City", "Region", "Country"), sep = "\\,")
df_country1[is.na(df_country1)] <- ""
#Sub-dataset 
small_DF <- select(crashes, c(AC.Type, Aboard))
#Changing Aboard to a numeric
small_DF$Aboard <- as.numeric(small_DF$Aboard)
NAs introduced by coercion
small_DF <- small_DF %>%
  #Getting the first word of the manufacturer to use for later analysis
  separate(col = AC.Type, into = c("Manufacturer"), sep = "\\ ") %>% 
  #grouping by the manufacturer
  group_by(Manufacturer) %>% 
  #adding up the total aboard per manufacturer
  summarise(x = Aboard) %>% 
  arrange(desc(x)) %>% 
  #filtering out flights that had less than 250 because I felt that would skew the results
  filter(x > 250)
Expected 1 pieces. Additional pieces discarded in 4896 rows [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, ...].`summarise()` has grouped output by 'Manufacturer'. You can override using the `.groups` argument.
small_DF <- small_DF %>%
  group_by(Manufacturer) %>% 
  summarise(x = sum(x)) %>% 
  arrange(desc(x)) %>% 
  filter(x > 250)

small_DF
#Changing the data type of Aboard to a numeriv
date_df$Aboard <- as.numeric(date_df$Aboard)
NAs introduced by coercion
df_fatalityRate <- date_df %>%
  separate(col = AC.Type, into = c("Manufacturer"), sep = "\\ ") %>% 
  #filtering for manufacturers that are in the dataset I created in the last chunk
  filter(Manufacturer %in% small_DF$Manufacturer) %>%
  group_by(Manufacturer, Year) %>% 
  #summing the totals across all flights per manufacturer 
  #I did it this way as I believe that this is more accurate then taking the average.
  summarise(total_Fatalities = sum(Fatalities), total_Aboard = sum(Aboard)) %>% 
  #calculating the fatality rate
  mutate(Fatality_Rate = (total_Fatalities/total_Aboard) * 100)
Expected 1 pieces. Additional pieces discarded in 4896 rows [1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, ...].`summarise()` has grouped output by 'Manufacturer'. You can override using the `.groups` argument.
df_fatalityRate




3 Data Analysis

3.1 Has the number of airplane creashes increased or decreased over the years/decades?

#creating the plot
ggplot() +
  
  #adding the line that represents fatalities per year
  geom_line(year_df, mapping = aes(x = Year, y = Fatalities), color = "Blue")+
  
  #adding the line that represents fatalities per decade
  geom_line(decade_df, mapping = aes(x = Decade, y = Fatalities/10), color = "Red")+
  
  #adding title, subtitle, and caption
  labs(title = "Fatalities by Year and Decade",
       subtitle = "Worldwide Airplane Fatalities from 1908 till 2019",
       caption = "Data Source: Kaggle.com") +
  geom_smooth()+
  
  #making the dual axis, and adding commas to the y-axis scales
  scale_y_continuous(
    name = "Annual Fatalities",
    labels = scales::comma,
    sec.axis = sec_axis(~.*10, name = "Decade Fatalities", labels = scales::comma))+
  
  theme_minimal() +
  
  #making the coloring of the y-axis match the color of their respective lines
  theme(axis.text.y.left = element_text(color = "blue")) +
  theme(axis.text.y.right = element_text(color = "red")) +
  
  #positioning the title left aligned, not aligned with the plot
  theme(plot.title.position = "plot")


#For this graph, I tried adding the colors to the title of the graph to match the lines, but i could not figure it out.

In this graph, you can see that based on the years, fatalities peaked just before 1975. It then had a slight decrease. Based off of the decades, it is showing the peak fatalities around the same time, but it shows that overall the Fatalities were steadly decreasing.




3.2 What Regions have the most amount of crashes?

df_country1 %>% 
  ggplot(aes(x = reorder(Loc, n), y = n, fill = Region)) +
    geom_col() +
    scale_fill_brewer(palette = "Blues")+
    coord_flip() +
    labs(title = "Regions with the Most Crashes",
         y = "Number of Crashes", 
         x = "") +
    geom_text(aes(label = n), hjust = -0.5)+
  theme_minimal() +
  guides(fill = FALSE) +
  theme(plot.title.position = "plot")

This graph was shows the regions with the most common plane crashes. I think it is intresting that Russia has a decent size gap over New York. I say decent because as I was looking at this graph I noticed that there was a location called “near Moscow”, so adding that to the other bar of Russia, it has a total of 28 plane crashes.




3.3 What is the Fatality Rate per Year by Manufacturer?

#The commented out lines didn't work. I believe it has to do with me using plotly. But if I wasnt, I would have left aligned my title, and added a caption.
f <- df_fatalityRate %>% 
  ggplot(data = df_fatalityRate, mapping = aes(x = Manufacturer, y = Year, fill = Fatality_Rate))+
  labs(title = "Fatality Rate by Manufacturer") +
       #caption = "Data Source: kaggle.com") +
  geom_tile() +
  guides(fill = FALSE)
  #theme(plot.title.position = "plot")
ggplotly(f)

This graph is showing the top manufacturers, and the fatality rates per year. The darker the color, the lower the fatality rate. I mention this because I want to compare Boeing and Lockheed Martin. They are two major companies and as you can see Lockheeds fatality rate is higher. (I guess that is a good thing, as boeing supplies the commericial aircraft.)




4 Future Works

I really enjoyed exploring this dataset, and I wish I had more time. Some ideas that I wish to add:

  1. exploring how the operator of the flight could have effected the outcome of the flight. I noticed there was a lot of military operators, both foreign and domestic.
  2. use data mining to explore the summary of the crash to see how many were truly accidents vs. planned attacks.




LS0tDQp0aXRsZTogIkRhdGEgVmlzdWFsaXphdGlvbiAtIE1pbmktUHJvamVjdCAxIg0KYXV0aG9yOiAiS2FpdGx5biBTY2hlcHBhIGBrc2NoZXBwYTQ3MDdAZmxvcmlkYXBvbHkuZWR1YCINCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgdG9jX2RlcHRoOiA0DQogICAgbnVtYmVyX3NlY3Rpb25zOiBUUlVFDQogICAgdGhlbWU6IHVuaXRlZA0KLS0tDQoNCmBgYHtyLCBXYXJuaW5nID0gRkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkocGxvdGx5KQ0KYGBgDQoNCjxicj4NCg0KLS0tDQoNCjxicj4NCg0KDQojIEludHJvZHVjdGlvbg0KDQpBdmlhdGlvbiBzYWZ0ZXkgaXMgYSB0b3BpYyB0aGF0IGhpdHMgY2xvc2UgdG8gaG9tZSwgYXMgSSByZWNlbnRseSBsb3N0IGEgY28td29ya2VyIGluIGFuIGFpcnBsYW5lIGNyYXNoLiBGb3IgdGhpcyBwcm9qZWN0LCBteSBnb2FsIGlzIHRvIGV4cGxvcmUgYWlycGxhbmUgY3Jhc2hlcyB3b3JsZHdpZGUgdG8gZmluZCBvdXQgaG93IG9mdGVuIHRoZXkgYXJlIG9jY3VycmluZywgd2hhdCBtYW51ZmFjdHVyZXIgaGFzIHRoZSBtb3N0LCBhbmQgaG93IG1hbnkgZmF0YWxpdGllcyBhcmUgdGhlcmUgYXMgYSByZXN1bHQuIEZvciBteSBwcm9qZWN0LCBJIGFtIHVzaW5nIHRoZSBgQWlycGxhbmUgQ3Jhc2ggRGF0YSBTaW5jZSAxOTA4YCBkYXRhc2V0LCB3aGljaCBpcyBhIGNvbGxlY3Rpb24gb2YgdGhlIG51bWJlciBvZiBjcmFzaGVzIGZyb20gMTkwOCB0aWxsIDIwMTkuDQoNCiMjIFRoZSBEYXRhc2V0DQoNCmBgYHtyfQ0KI015IGRhdGEgDQpjcmFzaGVzIDwtIHJlYWQuY3N2KCIuLi9kYXRhL2FpcnBsYW5lZGF0YS5jc3YiKQ0KaGVhZChjcmFzaGVzKQ0KYGBgDQoNCjxicj4NCg0KLS0tDQoNCjxicj4NCg0KDQojIERhdGEgV3JhbmdsaW5nIGFuZCBFeHBsb3JhdGlvbg0KDQpgYGB7cn0NCiNTZXBhcmF0aW5nIHRoZSBEYXRlIGNvbHVtbiBpbnRvIDMgZGlmZmVyZW50IG9uZXMgdG8gcGVyZm9ybSBhIGJldHRlciBhbmFseXNpcw0KZGYgPC0gc2VwYXJhdGUoZGF0YSA9IGNyYXNoZXMsY29sID0gRGF0ZSwgaW50byA9IGMoIk1vbnRoIiwgIkRheSIsICJZZWFyIiksIHNlcCA9ICJcXC8iKQ0KI1NlbGVjdGluZyB0aGUgY29sdW1ucyB0aGF0IEkgbmVlZCB0byBwZXJmb3JtIG15IGFuYWx5c2lzDQpkYXRlX2RmIDwtIHNlbGVjdChkZiwgYyhNb250aCwgWWVhciwgRmF0YWxpdGllcywgQWJvYXJkLCBBQy5UeXBlKSkNCmBgYA0KDQpgYGB7cn0NCiNDaGFuZ2luZyB0aGUgZGF0YSB0eXBlIG9mIGZhdGFsaXRpZXMgdG8gYSBudW1lcmljDQpkYXRlX2RmJEZhdGFsaXRpZXMgPC0gYXMubnVtZXJpYyhkYXRlX2RmJEZhdGFsaXRpZXMpDQojQ2hhbmdpbmcgYWxsIHRoZSBOQXMgdG8gMHMNCmRhdGVfZGZbaXMubmEoZGF0ZV9kZildIDwtIDANCiNDaGFuZ2luZyB0aGUgZGF0YSB0eXBlIG9mIHllYXIgdG8gYSBudW1lcmljDQpkYXRlX2RmJFllYXIgPC0gYXMubnVtZXJpYyhkYXRlX2RmJFllYXIpDQpgYGANCg0KYGBge3J9DQojQ3JlYXRpbmcgYSBuZXcgY29sdW1uIGluIG91ciBkYXRhc2V0IGNhbGxlZCBkZWNhZGUNCmRhdGVfZGYgPC0gZGF0ZV9kZiAlPiUgDQogIG11dGF0ZShEZWNhZGUgPSBmbG9vcihZZWFyLzEwKSAqIDEwKQ0KYGBgDQoNCmBgYHtyfQ0KI1N1bW1pbmcgYWxsIHRoZSBmYXRhbGl0aWVzIHBlciBZZWFyDQp5ZWFyX2RmIDwtIGRhdGVfZGYgJT4lIA0KICBncm91cF9ieShZZWFyKSAlPiUgDQogIHN1bW1hcmlzZShGYXRhbGl0aWVzID0gc3VtKEZhdGFsaXRpZXMpKQ0KYGBgDQoNCmBgYHtyfQ0KI1N1bW1pbmcgYWxsIHRoZSBmYXRhbGl0aWVzIHBlciBEZWNhZGUNCmRlY2FkZV9kZiA8LSBkYXRlX2RmICU+JSANCiAgZ3JvdXBfYnkoRGVjYWRlKSAlPiUgDQogIHN1bW1hcmlzZShGYXRhbGl0aWVzID0gc3VtKEZhdGFsaXRpZXMpKQ0KYGBgDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0KI0NyZWF0aW5nIGEgbmV3IGRhdGFzZXQsIHRoYXQgaGFzIG5vIE5Bcw0KZGZfY291bnRyeSA8LSBjcmFzaGVzDQpkZl9jb3VudHJ5W2lzLm5hKGRmX2NvdW50cnkpXSA8LSAiIg0KDQojZ3JvdXBpbmcgdGhlbSBieSBMb2NhdGlvbiwgYW5kIHRhbGx5aW5nIHRoZW0gdXAsIGFuZCBzZWxlY3RpbmcgdGhlIGxvY2F0aW9ucyB0aGF0IGhhZCBtb3JlIHRoYW4gMTAgY3Jhc2hlcw0KZGZfY291bnRyeTEgPC0gZGZfY291bnRyeSAlPiUgDQogIGdyb3VwX2J5KExvY2F0aW9uKSAlPiUgDQogIHRhbGx5KCkgJT4lIA0KICBmaWx0ZXIobiA+PSAxMCkNCg0KI3NwbGl0dGluZyB0aGUgbG9jYXRpb24gY291bGluZyBpbnRvIGNpdHksIHJlZ2lvbiwgYW5kIGNvdW50cnkNCmRmX2NvdW50cnkxJExvYyA8LSBkZl9jb3VudHJ5MSRMb2NhdGlvbg0KZGZfY291bnRyeTEgPC0gc2VwYXJhdGUoZGF0YSA9IGRmX2NvdW50cnkxLCBjb2wgPSBMb2NhdGlvbiwgaW50byA9IGMoIkNpdHkiLCAiUmVnaW9uIiwgIkNvdW50cnkiKSwgc2VwID0gIlxcLCIpDQpkZl9jb3VudHJ5MVtpcy5uYShkZl9jb3VudHJ5MSldIDwtICIiDQpgYGANCg0KDQpgYGB7cn0NCiNTdWItZGF0YXNldCANCnNtYWxsX0RGIDwtIHNlbGVjdChjcmFzaGVzLCBjKEFDLlR5cGUsIEFib2FyZCkpDQojQ2hhbmdpbmcgQWJvYXJkIHRvIGEgbnVtZXJpYw0Kc21hbGxfREYkQWJvYXJkIDwtIGFzLm51bWVyaWMoc21hbGxfREYkQWJvYXJkKQ0Kc21hbGxfREYgPC0gc21hbGxfREYgJT4lDQogICNHZXR0aW5nIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBtYW51ZmFjdHVyZXIgdG8gdXNlIGZvciBsYXRlciBhbmFseXNpcw0KICBzZXBhcmF0ZShjb2wgPSBBQy5UeXBlLCBpbnRvID0gYygiTWFudWZhY3R1cmVyIiksIHNlcCA9ICJcXCAiKSAlPiUgDQogICNncm91cGluZyBieSB0aGUgbWFudWZhY3R1cmVyDQogIGdyb3VwX2J5KE1hbnVmYWN0dXJlcikgJT4lIA0KICAjYWRkaW5nIHVwIHRoZSB0b3RhbCBhYm9hcmQgcGVyIG1hbnVmYWN0dXJlcg0KICBzdW1tYXJpc2UoeCA9IEFib2FyZCkgJT4lIA0KICBhcnJhbmdlKGRlc2MoeCkpICU+JSANCiAgI2ZpbHRlcmluZyBvdXQgZmxpZ2h0cyB0aGF0IGhhZCBsZXNzIHRoYW4gMjUwIGJlY2F1c2UgSSBmZWx0IHRoYXQgd291bGQgc2tldyB0aGUgcmVzdWx0cw0KICBmaWx0ZXIoeCA+IDI1MCkNCg0Kc21hbGxfREYgPC0gc21hbGxfREYgJT4lDQogIGdyb3VwX2J5KE1hbnVmYWN0dXJlcikgJT4lIA0KICBzdW1tYXJpc2UoeCA9IHN1bSh4KSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoeCkpICU+JSANCiAgZmlsdGVyKHggPiAyNTApDQoNCnNtYWxsX0RGDQpgYGANCg0KYGBge3J9DQojQ2hhbmdpbmcgdGhlIGRhdGEgdHlwZSBvZiBBYm9hcmQgdG8gYSBudW1lcml2DQpkYXRlX2RmJEFib2FyZCA8LSBhcy5udW1lcmljKGRhdGVfZGYkQWJvYXJkKQ0KZGZfZmF0YWxpdHlSYXRlIDwtIGRhdGVfZGYgJT4lDQogIHNlcGFyYXRlKGNvbCA9IEFDLlR5cGUsIGludG8gPSBjKCJNYW51ZmFjdHVyZXIiKSwgc2VwID0gIlxcICIpICU+JSANCiAgI2ZpbHRlcmluZyBmb3IgbWFudWZhY3R1cmVycyB0aGF0IGFyZSBpbiB0aGUgZGF0YXNldCBJIGNyZWF0ZWQgaW4gdGhlIGxhc3QgY2h1bmsNCiAgZmlsdGVyKE1hbnVmYWN0dXJlciAlaW4lIHNtYWxsX0RGJE1hbnVmYWN0dXJlcikgJT4lDQogIGdyb3VwX2J5KE1hbnVmYWN0dXJlciwgWWVhcikgJT4lIA0KICAjc3VtbWluZyB0aGUgdG90YWxzIGFjcm9zcyBhbGwgZmxpZ2h0cyBwZXIgbWFudWZhY3R1cmVyIA0KICAjSSBkaWQgaXQgdGhpcyB3YXkgYXMgSSBiZWxpZXZlIHRoYXQgdGhpcyBpcyBtb3JlIGFjY3VyYXRlIHRoZW4gdGFraW5nIHRoZSBhdmVyYWdlLg0KICBzdW1tYXJpc2UodG90YWxfRmF0YWxpdGllcyA9IHN1bShGYXRhbGl0aWVzKSwgdG90YWxfQWJvYXJkID0gc3VtKEFib2FyZCkpICU+JSANCiAgI2NhbGN1bGF0aW5nIHRoZSBmYXRhbGl0eSByYXRlDQogIG11dGF0ZShGYXRhbGl0eV9SYXRlID0gKHRvdGFsX0ZhdGFsaXRpZXMvdG90YWxfQWJvYXJkKSAqIDEwMCkNCg0KZGZfZmF0YWxpdHlSYXRlDQpgYGANCjxicj4NCg0KLS0tDQoNCjxicj4NCg0KIyBEYXRhIEFuYWx5c2lzDQoNCiMjIEhhcyB0aGUgbnVtYmVyIG9mIGFpcnBsYW5lIGNyZWFzaGVzIGluY3JlYXNlZCBvciBkZWNyZWFzZWQgb3ZlciB0aGUgeWVhcnMvZGVjYWRlcz8NCg0KYGBge3J9DQojY3JlYXRpbmcgdGhlIHBsb3QNCmdncGxvdCgpICsNCiAgDQogICNhZGRpbmcgdGhlIGxpbmUgdGhhdCByZXByZXNlbnRzIGZhdGFsaXRpZXMgcGVyIHllYXINCiAgZ2VvbV9saW5lKHllYXJfZGYsIG1hcHBpbmcgPSBhZXMoeCA9IFllYXIsIHkgPSBGYXRhbGl0aWVzKSwgY29sb3IgPSAiQmx1ZSIpKw0KICANCiAgI2FkZGluZyB0aGUgbGluZSB0aGF0IHJlcHJlc2VudHMgZmF0YWxpdGllcyBwZXIgZGVjYWRlDQogIGdlb21fbGluZShkZWNhZGVfZGYsIG1hcHBpbmcgPSBhZXMoeCA9IERlY2FkZSwgeSA9IEZhdGFsaXRpZXMvMTApLCBjb2xvciA9ICJSZWQiKSsNCiAgDQogICNhZGRpbmcgdGl0bGUsIHN1YnRpdGxlLCBhbmQgY2FwdGlvbg0KICBsYWJzKHRpdGxlID0gIkZhdGFsaXRpZXMgYnkgWWVhciBhbmQgRGVjYWRlIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJXb3JsZHdpZGUgQWlycGxhbmUgRmF0YWxpdGllcyBmcm9tIDE5MDggdGlsbCAyMDE5IiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgU291cmNlOiBLYWdnbGUuY29tIikgKw0KICBnZW9tX3Ntb290aCgpKw0KICANCiAgI21ha2luZyB0aGUgZHVhbCBheGlzLCBhbmQgYWRkaW5nIGNvbW1hcyB0byB0aGUgeS1heGlzIHNjYWxlcw0KICBzY2FsZV95X2NvbnRpbnVvdXMoDQogICAgbmFtZSA9ICJBbm51YWwgRmF0YWxpdGllcyIsDQogICAgbGFiZWxzID0gc2NhbGVzOjpjb21tYSwNCiAgICBzZWMuYXhpcyA9IHNlY19heGlzKH4uKjEwLCBuYW1lID0gIkRlY2FkZSBGYXRhbGl0aWVzIiwgbGFiZWxzID0gc2NhbGVzOjpjb21tYSkpKw0KICANCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgDQogICNtYWtpbmcgdGhlIGNvbG9yaW5nIG9mIHRoZSB5LWF4aXMgbWF0Y2ggdGhlIGNvbG9yIG9mIHRoZWlyIHJlc3BlY3RpdmUgbGluZXMNCiAgdGhlbWUoYXhpcy50ZXh0LnkubGVmdCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJibHVlIikpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnkucmlnaHQgPSBlbGVtZW50X3RleHQoY29sb3IgPSAicmVkIikpICsNCiAgDQogICNwb3NpdGlvbmluZyB0aGUgdGl0bGUgbGVmdCBhbGlnbmVkLCBub3QgYWxpZ25lZCB3aXRoIHRoZSBwbG90DQogIHRoZW1lKHBsb3QudGl0bGUucG9zaXRpb24gPSAicGxvdCIpDQoNCiNGb3IgdGhpcyBncmFwaCwgSSB0cmllZCBhZGRpbmcgdGhlIGNvbG9ycyB0byB0aGUgdGl0bGUgb2YgdGhlIGdyYXBoIHRvIG1hdGNoIHRoZSBsaW5lcywgYnV0IGkgY291bGQgbm90IGZpZ3VyZSBpdCBvdXQuDQoNCmBgYA0KPiBJbiB0aGlzIGdyYXBoLCB5b3UgY2FuIHNlZSB0aGF0IGJhc2VkIG9uIHRoZSB5ZWFycywgZmF0YWxpdGllcyBwZWFrZWQganVzdCBiZWZvcmUgMTk3NS4gSXQgdGhlbiBoYWQgYSBzbGlnaHQgZGVjcmVhc2UuIEJhc2VkIG9mZiBvZiB0aGUgZGVjYWRlcywgaXQgaXMgc2hvd2luZyB0aGUgcGVhayBmYXRhbGl0aWVzIGFyb3VuZCB0aGUgc2FtZSB0aW1lLCBidXQgaXQgc2hvd3MgdGhhdCBvdmVyYWxsIHRoZSBGYXRhbGl0aWVzIHdlcmUgc3RlYWRseSBkZWNyZWFzaW5nLg0KDQo8YnI+DQoNCi0tLQ0KDQo8YnI+DQoNCiMjIFdoYXQgUmVnaW9ucyBoYXZlIHRoZSBtb3N0IGFtb3VudCBvZiBjcmFzaGVzPw0KDQpgYGB7ciBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD0zLCB3YXJuaW5nPUZBTFNFfQ0KZGZfY291bnRyeTEgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKExvYywgbiksIHkgPSBuLCBmaWxsID0gUmVnaW9uKSkgKw0KICAgIGdlb21fY29sKCkgKw0KICAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiQmx1ZXMiKSsNCiAgICBjb29yZF9mbGlwKCkgKw0KICAgIGxhYnModGl0bGUgPSAiUmVnaW9ucyB3aXRoIHRoZSBNb3N0IENyYXNoZXMiLA0KICAgICAgICAgeSA9ICJOdW1iZXIgb2YgQ3Jhc2hlcyIsIA0KICAgICAgICAgeCA9ICIiKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLCBoanVzdCA9IC0wLjUpKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBndWlkZXMoZmlsbCA9IEZBTFNFKSArDQogIHRoZW1lKHBsb3QudGl0bGUucG9zaXRpb24gPSAicGxvdCIpDQpgYGANCj4gVGhpcyBncmFwaCB3YXMgc2hvd3MgdGhlIHJlZ2lvbnMgd2l0aCB0aGUgbW9zdCBjb21tb24gcGxhbmUgY3Jhc2hlcy4gSSB0aGluayBpdCBpcyBpbnRyZXN0aW5nIHRoYXQgUnVzc2lhIGhhcyBhIGRlY2VudCBzaXplIGdhcCBvdmVyIE5ldyBZb3JrLiBJIHNheSBkZWNlbnQgYmVjYXVzZSBhcyBJIHdhcyBsb29raW5nIGF0IHRoaXMgZ3JhcGggSSBub3RpY2VkIHRoYXQgdGhlcmUgd2FzIGEgbG9jYXRpb24gY2FsbGVkICJuZWFyIE1vc2NvdyIsIHNvIGFkZGluZyB0aGF0IHRvIHRoZSBvdGhlciBiYXIgb2YgUnVzc2lhLCBpdCBoYXMgYSB0b3RhbCBvZiAyOCBwbGFuZSBjcmFzaGVzLg0KDQo8YnI+DQoNCi0tLQ0KDQo8YnI+DQoNCiMjIFdoYXQgaXMgdGhlIEZhdGFsaXR5IFJhdGUgcGVyIFllYXIgYnkgTWFudWZhY3R1cmVyPw0KDQoNCmBgYHtyLCB3YXJuaW5nPUZBTFNFfQ0KI1RoZSBjb21tZW50ZWQgb3V0IGxpbmVzIGRpZG4ndCB3b3JrLiBJIGJlbGlldmUgaXQgaGFzIHRvIGRvIHdpdGggbWUgdXNpbmcgcGxvdGx5LiBCdXQgaWYgSSB3YXNudCwgSSB3b3VsZCBoYXZlIGxlZnQgYWxpZ25lZCBteSB0aXRsZSwgYW5kIGFkZGVkIGEgY2FwdGlvbi4NCmYgPC0gZGZfZmF0YWxpdHlSYXRlICU+JSANCiAgZ2dwbG90KGRhdGEgPSBkZl9mYXRhbGl0eVJhdGUsIG1hcHBpbmcgPSBhZXMoeCA9IE1hbnVmYWN0dXJlciwgeSA9IFllYXIsIGZpbGwgPSBGYXRhbGl0eV9SYXRlKSkrDQogIGxhYnModGl0bGUgPSAiRmF0YWxpdHkgUmF0ZSBieSBNYW51ZmFjdHVyZXIiKSArDQogICAgICAgI2NhcHRpb24gPSAiRGF0YSBTb3VyY2U6IGthZ2dsZS5jb20iKSArDQogIGdlb21fdGlsZSgpICsNCiAgZ3VpZGVzKGZpbGwgPSBGQUxTRSkNCiAgI3RoZW1lKHBsb3QudGl0bGUucG9zaXRpb24gPSAicGxvdCIpDQpnZ3Bsb3RseShmKQ0KYGBgDQoNCj4gVGhpcyBncmFwaCBpcyBzaG93aW5nIHRoZSB0b3AgbWFudWZhY3R1cmVycywgYW5kIHRoZSBmYXRhbGl0eSByYXRlcyBwZXIgeWVhci4gVGhlIGRhcmtlciB0aGUgY29sb3IsIHRoZSBsb3dlciB0aGUgZmF0YWxpdHkgcmF0ZS4gSSBtZW50aW9uIHRoaXMgYmVjYXVzZSBJIHdhbnQgdG8gY29tcGFyZSBCb2VpbmcgYW5kIExvY2toZWVkIE1hcnRpbi4gVGhleSBhcmUgdHdvIG1ham9yIGNvbXBhbmllcyBhbmQgYXMgeW91IGNhbiBzZWUgTG9ja2hlZWRzIGZhdGFsaXR5IHJhdGUgaXMgaGlnaGVyLiAoSSBndWVzcyB0aGF0IGlzIGEgZ29vZCB0aGluZywgYXMgYm9laW5nIHN1cHBsaWVzIHRoZSBjb21tZXJpY2lhbCBhaXJjcmFmdC4pDQoNCjxicj4NCg0KLS0tDQoNCjxicj4NCg0KIyBGdXR1cmUgV29ya3MNCg0KSSByZWFsbHkgZW5qb3llZCBleHBsb3JpbmcgdGhpcyBkYXRhc2V0LCBhbmQgSSB3aXNoIEkgaGFkIG1vcmUgdGltZS4gU29tZSBpZGVhcyB0aGF0IEkgd2lzaCB0byBhZGQ6DQoNCjEuIGV4cGxvcmluZyBob3cgdGhlIGBvcGVyYXRvcmAgb2YgdGhlIGZsaWdodCBjb3VsZCBoYXZlIGVmZmVjdGVkIHRoZSBvdXRjb21lIG9mIHRoZSBmbGlnaHQuIEkgbm90aWNlZCB0aGVyZSB3YXMgYSBsb3Qgb2YgbWlsaXRhcnkgb3BlcmF0b3JzLCBib3RoIGZvcmVpZ24gYW5kIGRvbWVzdGljLiANCjIuIHVzZSBkYXRhIG1pbmluZyB0byBleHBsb3JlIHRoZSBgc3VtbWFyeWAgb2YgdGhlIGNyYXNoIHRvIHNlZSBob3cgbWFueSB3ZXJlIHRydWx5IGFjY2lkZW50cyB2cy4gcGxhbm5lZCBhdHRhY2tzLg0KDQo8YnI+DQoNCi0tLQ0KDQo8YnI+DQoNCg==